﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Datos;

namespace Negocio
{
    public class Usuario : Base
    {
        #region Constantes

        const string ERR_SOURCE = "Usuario";

        #endregion

        #region Atributos y Propiedades  

        private string _login;
        public string Login
        {
            get { return _login; }
            set { _login = value;  MarcarModificado();}
        }

        private string _clave;
        public string Clave
        {
            get { return _clave; }
            set { _clave = value;  MarcarModificado();}
        }

        #endregion 

        #region Acceso a Datos

        protected override bool LeerDB()
        {
            bool existe = false;
            object[] parametros ={ _login, null};
            IDataReader dr = DatosOleDb.DB().ObtenerDataReader("UsuarioSFiltro", parametros);
            if (dr.Read())
            {
                CargarDR(dr);
                existe = true;
            }

            dr.Close();
            return existe;
        }

        protected override void InsertDB()
        {
		object[] parametros = new object[] {_login , _clave };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("UsuarioI", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.SqlClient.SqlException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("Ya existe un Usuario con el login " + _login, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void UpdateDB()
        {
		object[] parametros = new object[] {_login , _clave };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("UsuarioU", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (System.Data.SqlClient.SqlException)
            {
                DatosOleDb.DB().TxRollback();
                DatosException ex = new DatosException("Ya existe un Usuario con el login " + _login, ERR_SOURCE);
                throw ex;
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void DeleteDB()
        {
            object[] parametros = new object[] {_login };
            DatosOleDb.DB().TxBegin();
            try
            {
                DatosOleDb.DB().EnviarDatos("UsuarioD", ref parametros);
                DatosOleDb.DB().TxCommit();
            }
            catch (Exception)
            {
                DatosOleDb.DB().TxRollback();
                throw;
            }
        }

        protected override void CargarDR(IDataReader dr)
        {          
            _login = dr["login"].ToString();
            _clave = dr["clave"].ToString();
            MarcarViejo();
        }

        public override void Validar()
        {
            InconsistenciaException ex = new InconsistenciaException();
            ex.Source = ERR_SOURCE;
            if (_login == string.Empty) ex.AgregarError("Dato requerido", "Login");
            ex.Lanzar();
        }

        #endregion

        #region Métodos estéticos de Clase

        public static Usuario ObtenerPorLogin(string login)
        {
            Usuario obj = new Usuario();
            obj._login = login;
            if (obj.LeerDB())
            {
                return obj;
            }
            else
            {
                return null;
            }

        }

        public static List<Usuario> ObtenerTodos()
        {
            Usuario obj;
            List<Usuario> lista = new List<Usuario>();
            object[] parametros = { null, null};
            IDataReader dr;
            dr = DatosOleDb.DB().ObtenerDataReader("UsuarioSFiltro", parametros);
            while (dr.Read())
            {
                obj = new Usuario();
                obj.CargarDR(dr);             
                lista.Add(obj);
            }
            dr.Close();
            return lista;
        }

        public static List<Usuario> ObtenerPorFiltro(string login)
        {
            Usuario obj;
            List<Usuario> lista = new List<Usuario>();
            object[] parametros = { login, null};
            IDataReader dr;
            dr = DatosOleDb.DB().ObtenerDataReader("UsuarioSFiltro", parametros);
            while (dr.Read())
            {
                obj = new Usuario();
                obj.CargarDR(dr);             
                lista.Add(obj);
            }
            dr.Close();
            return lista;
        }
        #endregion
    }
}
